package com.java.java基础.反射;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * 反射问题
 */
public class ReflectionQusetion {
    // 根据我配置文re.properties文件，确定信息，创建不同类对象，并调用方法hi
    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        // 1.使用properties类可以读取配置文件
        Properties properties = new Properties(); // 创建Properties对象
        properties.load(new FileInputStream("src/test.properties")); // Properties对象加载文件流得到文件内容
        String classname = properties.get("classname").toString();
        String classpath = properties.get("classpath").toString(); // 获取内容并转为字符串
        String method = properties.get("method").toString();
        System.out.println("类名" + classname);
        System.out.println("类地址" + classpath);

        // 2.创建对象 传统方法不行
        // 3.使用反射机制
        // （1）加载类 ，返回Class的对象cls
        Class cls = Class.forName(classpath);
        // (2)通过cls得到你加载的类xxxx的实例化对象的实例
        Object o = cls.newInstance();
        System.out.println("o的运行类型为：" + o.getClass());
        // （3）通过cls得到你加载的类的xxxx的方法 。反射中的方法也是对象，都是通过反射得到的
        Method method1 = cls.getMethod(method);
        // 通过方法对象调用方法
        method1.invoke(cls); // 反射 方法.invoke(对象)调用方法
        // 反射读取配置
    }
}
